package controller

import (
	"bluebell/dao/mysql"
	"bluebell/logic"
	"bluebell/models"
	"errors"

	"github.com/go-playground/validator/v10"

	"go.uber.org/zap"

	"github.com/gin-gonic/gin"
)

// SignUpHandler 注册用户
// @Summary 用户注册接口
// @Description 输入用户名，密码，确认密码进行注册
// @Tags 用户相关
// @Accept application/json
// @Produce application/json
// @Param user_name header string false "用户名字"
// @Param object query models.ParamPostList false "查询参数"
// @Security ApiKeyAuth
// @Success 200 {object} nil
// @Router /signup [post]
func SignUpHandler(ctx *gin.Context) {
	// 1.获取参数和参数校验
	var p models.ParamSignUp
	if err := ctx.ShouldBind(&p); err != nil {
		zap.L().Error("SignUp with invalid param", zap.Error(err))
		// 判断err是不是validator.Validations 类型
		errs, ok := err.(validator.ValidationErrors)
		if !ok {
			ResponseError(ctx, CodeInvalidParam)
			return
		}
		ResponseErrorWithMsg(ctx, CodeInvalidParam, errs.Translate(trans))
	}

	// 2.业务处理
	if err := logic.SignUp(&p); err != nil {
		zap.L().Error("logic.SignUp failed", zap.Error(err))
		if errors.Is(err, mysql.ErrorUserExist) {
			ResponseError(ctx, CodeUserExist)
			return
		}
		ResponseError(ctx, CodeServerBusy)
		return
	}

	// 3.返回响应
	ResponseSuccess(ctx, nil)
}

func LoginHandler(ctx *gin.Context) {
	// 1. 获取参数
	var p models.ParamLogin
	if err := ctx.ShouldBind(&p); err != nil {
		zap.L().Error("Login with invalid param", zap.String("username", p.UserName), zap.Error(err))
		// 判断err是不是validator.Validations 类型
		errs, ok := err.(validator.ValidationErrors)
		if !ok {
			ResponseError(ctx, CodeInvalidParam)
			return
		}
		ResponseErrorWithMsg(ctx, CodeInvalidParam, errs.Translate(trans))
		return
	}

	// 2. 逻辑处理
	token, err := logic.Login(&p)
	if err != nil {
		zap.L().Error("Login failed", zap.Error(err))
		if errors.Is(err, mysql.ErrorUserExist) {
			ResponseError(ctx, CodeUserExist)
			return
		}
		ResponseError(ctx, CodeInvalidPassword)
		return
	}

	// 3.返回响应
	ResponseSuccess(ctx, token)
}
